package cn.quevo.core.lang;

import cn.quevo.core.enums.EnumsInterface;

/**
 * 枚举工具类
 *
 * @author July july_sky@foxmail.com
 * @version 1.0
 * @date 2018-03-09 16:07:31
 * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
 * @return
 */
public class EnumUtils extends org.apache.commons.lang3.EnumUtils {
    /**
     * 根据枚举编码获取枚举信息
     *
     * @param enumCode
     * @param enums
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:07:44
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    @SuppressWarnings("unchecked")
    public static <E extends EnumsInterface> E getEnum(final Object enumCode, EnumsInterface... enums) {
        if (StringUtils.isBlank(enumCode) || enums == null || enums.length == 0) {
            return null;
        }
        for (EnumsInterface en : enums) {
            if (en.getCode().equals(enumCode)) {
                return (E) en;
            }
        }
        return null;
    }

    /**
     * 根据枚举编码获取枚举信息,忽略大小写
     *
     * @param enumCode
     * @param enums
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:07:44
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    @SuppressWarnings("unchecked")
    public static <E extends EnumsInterface> E getEnumIgnoreCase(final Object enumCode, EnumsInterface... enums) {
        if (StringUtils.isBlank(enumCode) || enums == null || enums.length == 0) {
            return null;
        }
        for (EnumsInterface en : enums) {
            if (StringUtils.valueOf(en.getCode()).equalsIgnoreCase(StringUtils.valueOf(enumCode))) {
                return (E) en;
            }
        }
        return null;
    }

    /**
     * 判断枚举是否存在
     *
     * @param enumCode
     * @param enums
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:08:04
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static boolean existsEnum(final Object enumCode, EnumsInterface... enums) {
        return getEnum(enumCode, enums) == null ? false : true;
    }

    /**
     * 判断枚举是否存在,忽略大小写
     *
     * @param enumCode
     * @param enums
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:08:04
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static boolean existsEnumIgnoreCase(final Object enumCode, EnumsInterface... enums) {
        return getEnumIgnoreCase(enumCode, enums) == null ? false : true;
    }

    /**
     * 判断枚举是否存在
     *
     * @param enumCodes
     * @param enums
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:08:11
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static boolean existsEnums(final String enumCodes, EnumsInterface... enums) {
        if (enumCodes == null || enums == null || enums.length == 0) {
            return false;
        }
        String[] codes = enumCodes.split(",");
        for (String code : codes) {
            if (!existsEnum(code, enums)) {
                return false;
            }
        }
        return true;
    }
    /**
     * 判断枚举是否存在,忽略大小写
     *
     * @param enumCodes
     * @param enums
     * @return
     * @author July july_sky@foxmail.com
     * @date 2018-03-09 16:08:11
     * @Copyright ©2015-2035 湘豫(北京)科技有限公司. All Rights Reserved.
     * @version 1.0
     */
    public static boolean existsEnumsIgnoreCase(final String enumCodes, EnumsInterface... enums) {
        if (enumCodes == null || enums == null || enums.length == 0) {
            return false;
        }
        String[] codes = enumCodes.split(",");
        for (String code : codes) {
            if (!existsEnumIgnoreCase(code, enums)) {
                return false;
            }
        }
        return true;
    }
}
